// import 'dart:io';
import 'dart:io';
import 'dart:typed_data';

// import 'package:archive/archive.dart';
import '../../app_configure.dart';
import 'package:flutter/services.dart';

// const bool DEBUG = false;
// const int NO_DEVICE = -0x1000000;
// int connectDevice = NO_DEVICE;
// //final int BreakSeconds = (Platform.isIOS ? 5 : 20);
// Locale _appLocale;
// String APP_PATH = '';
const String _acceptFilename = 'AcceptFilename.txt';
const String _appConfigFileName = 'AppConfig.dat';
const String _app_Entry_FileName = 'program_entry.json';
// const platform = const MethodChannel('com.yundongjia.blocks/connector');
// Random random = Random.secure();
// int randomId() => random.nextInt(1 << 32);
int timeId() => DateTime.now().millisecondsSinceEpoch;
// String randomIdStr() => randomId().toRadixString(16).padLeft(8, '0');
String timeIdStr() => timeId().toRadixString(16).padLeft(8, '0');
// // List<ProgramEntity> APP_ProgramEntryList = [];
// DateTime lastConnectedStamp = DateTime.now();
Map<String, String> xmlFileMap = Map();
// bool _accept;
// bool accept() => _accept;
AppConfig appconfig = AppConfig.instance;

//APP初始化
void appInitialize() {
  // _loadLocal(); //加载本地
  _decodeResource(); //解压文件
  // _isAccept();
}

//是否接受协议
// void _isAccept() {
//   _accept = true;
//   return;
//   //TODO 暂时屏蔽
//   String result = readFile(_AcceptFilename);
//   _accept = result != null && 'Agree' == result;
//   print('_isAccept = $_accept');
// }

// void acceptProtocol() {
//   saveFile('Agree', _AcceptFilename);
//   _accept = true;
// }

//Local语言初始化
// void _loadLocal() {
//   String content = readFile(_APPConfigFileName);
//   String name = content ?? 'zh_CN';
//   //print('loadLocal content = $name');
//   List<String> lists = name.split('_');
//   _APPLocale = Locale(lists[0], lists.length > 1 ? lists[1] : '');
//   if (_APPLocale != null) {
//     AppLocalizations.load(_APPLocale);
//   }
// }

// void setLocale(Locale locale) {
//   _appLocale = locale;
//   final String content =
//       locale.countryCode.isEmpty ? locale.languageCode : locale.toString();
//   //print('set _APPLocale = $content');
//   saveFile(content, _APPConfigFileName);
// }

// Locale getLocale() {
//   return _appLocale;
// }

void _decodeResource() async {
  await appconfig.getDocumentRoot();
  //String htmlfilename  =  getBlocklyUrl();

  // String version = readFile('tests/version.txt');
  // if (version != null && _compareVersion(version, appconfig.version) > -1) {
  //   print('已经解压过，返回');
  //   return;
  // }
  // print('开始解压Blockly');
  // appconfig.getDocumentRoot().then(
  //       (path) => rootBundle.load('assets/blockly.dat').then(
  //         (ByteData bytedatas) {
  //           // Decode the Zip file
  //           bytedatas.setUint8(0, 80);
  //           bytedatas.setUint8(1, 75);
  //           bytedatas.setUint8(2, 3);
  //           bytedatas.setUint8(3, 4);
  //           final archive =
  //               ZipDecoder().decodeBytes(bytedatas.buffer.asUint8List());

  //           // Extract the contents of the Zip archive to disk.

  //           for (final file in archive) {
  //             final filename = file.name;
  //             if (file.isFile) {
  //               final data = file.content as List<int>;
  //               File(path + '/' + filename)
  //                 ..createSync(recursive: true)
  //                 ..writeAsBytesSync(data);
  //             } else {
  //               Directory(path + '/' + filename)..create(recursive: true);
  //             }
  //           }
  //         },
  //       ),
  //     );
}

int _compareVersion(String a, String b) {
  if (a == null || b == null) {
    return 0;
  }
  List<String> la = a.split('.');
  List<String> lb = b.split('.');
  if (la.length == lb.length) {
    return _compareStringList(la, lb);
  } else if (la.length < lb.length) {
    return -1;
  } else {
    return 1;
  }
}

int _compareStringList(List<String> a, List<String> b) {
  for (int i = 0; i < a.length; i++) {
    int va = int.parse(a[i]);
    int vb = int.parse(b[i]);

    if (va < vb) {
      return -1;
    } else if (va < vb) {
      return 1;
    }
  }
  return 0;
}

//编程控件的请求路径
// String getBlocklyUrl() {
//   return 'file://$_APP_PATH/tests/jimu02.html';
// }

File _getLocalFile(final String filename, [final bool create = true]) {
  File f = new File('${appconfig.appDocumentRootSync}/$filename');
  if (!f.existsSync()) {
    f.createSync();
  }
  return f;
}

bool saveBinaryFile(final Uint8List content,
    [final String fileanme = _app_Entry_FileName]) {
  File f = _getLocalFile(fileanme, true);
  // if (f == null) {
  //   return false;
  // }
  f.writeAsBytesSync(content);
  return true;
}

bool saveFile(final String content,
    [final String fileanme = _app_Entry_FileName]) {
  File f = _getLocalFile(fileanme, true);
  // if (f == null) {
  //   return false;
  // }
  f.writeAsStringSync(content);
  xmlFileMap.remove(fileanme);
  return true;
}

String readFile([final String fileanme = _app_Entry_FileName]) {
  String cacheContent = xmlFileMap[fileanme]!;
  if (cacheContent != null) {
    // print('return from cache');
    return cacheContent;
  }
  File f = _getLocalFile(fileanme, false);
  // if (f == null) {
  //   return null;
  // }
  cacheContent = f.readAsStringSync();
  xmlFileMap[fileanme] = cacheContent;
  return cacheContent;
}

File fileFromPath(final String filename) {
  return _getLocalFile(filename, false);
}
